#include "head.h"

int make_JWT(char* token, int net_fd, const char* buf)
{
    char* jwt;
    size_t jwt_length;

    // 初始化编码参数结构体
    struct l8w8jwt_encoding_params params;
//printf("struct!\n");
    l8w8jwt_encoding_params_init(&params);
//printf("init\n");

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;

    char tmp[1024] = {0};
    memset(tmp, 0, sizeof(tmp));
//printf("token is 0\n");
    snprintf(tmp, sizeof(buf), "%d&%s&", net_fd, buf);
//printf("token: %s\n", token);
    // 设置JWT的主要荷载部分内容:
    // 主题
    params.sub = tmp;
    //strcpy(params.sub, token);
//printf("params.sub: %s\n", params.sub);
    // 签发者
    params.iss = "";
    // 接收方
    params.aud = "";
    // token过期/有效时间(0x7fffffff:最大值-> 2038年1月19日)
    params.exp = 0x7fffffff;
    // token签发时间
    params.iat = 0;

    // 设置加密密钥
    params.secret_key = (unsigned char*)"myCloudDrive";
    params.secret_key_length = strlen((char *)params.secret_key);

    // 输出变量
    params.out = &jwt;
    params.out_length = &jwt_length;

    // 加密
    l8w8jwt_encode(&params);

    // 输出结果
    /* printf("l8w8jwt create token: %s \n",  jwt); */
    strcpy(token, jwt);
    return 0;
}



int free_JWT(char* jwt, char* buf){
/* printf("jwt: %s\n", jwt); */
    struct l8w8jwt_decoding_params params;
    l8w8jwt_decoding_params_init(&params);  

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;  

    // token值
    char* str = jwt;
/* printf("str: %s\n", str); */
//    strcpy(str, jwt);
    //char *str = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjIxNDc0ODM2NDcsInN1YiI6InByb2plY3QgbmFtZSIsImlzcyI6InNub3dfbGVlIiwiYXVkIjoidXNlciJ9.VnEv9-lo8jRw59-CyFLj19MIIWTwhwdrdeohOx7UH5Ms5akTkNg7whS0EdbL5s0COh3tlo1jaZp5XBNm12mRMQ";

    // eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjIxNDc0ODM2NDcsInN1YiI6IjEyMCIsImlzcyI6InNub3ciLCJhdWQiOiIxMjMifQ.YVkwJPI73DllFkXk8R3ca7cfeW5g2LywliCCNJBDDI7iJ1go0CveztepilX1I4YUWFPyo2tYFUit5BRujZw5og

    // 填入token字符串和长度
    params.jwt = (char*)str;
    params.jwt_length = strlen(str);

    // 设置密钥
    char *key="myCloudDrive";
    params.verification_key = (unsigned char*)key;
    params.verification_key_length = strlen(key);
/* printf("key: %s\n", key); */

    // 定义: 接收结果的指针和变量
    struct l8w8jwt_claim *claims = NULL;
    size_t claim_count = 0;
    enum l8w8jwt_validation_result validation_result;

    // 解码: 获得token中存储的信息
    int decode_result = l8w8jwt_decode(&params, &validation_result, &claims, &claim_count);

    // 判断是否是正确的token
    if (decode_result == L8W8JWT_SUCCESS && validation_result == L8W8JWT_VALID) {
        printf("Token validation successful!\n");

        strcpy(buf, claims[3].value);

        // 打印token中解码出来的荷载信息
        /* for (size_t i = 0; i < claim_count; i++) { */
            /* printf("Claim [%zu]: %s = %s\n", i, claims[i].key, claims[i].value); */
        /* } */

    } else {
        printf("Token validation failed!\n");
    }

    l8w8jwt_free_claims(claims, claim_count);


    return 0;
}
